後から追加した.gitignoreでgit管理対象から除外するのに苦労した話
はじめに
こんにちは。ネクストモード株式会社 の倉地です。
普段はTerraformのコードをGitHubで管理しているのですが、ブログのタイトルの通り.gitignoreの使い方で少し躓いた経験をしましたのでその内容と対処方法をご紹介します。
事象
Git環境の準備からトラブルに至るまでを時系列で記載していきます。
GitHubの準備
ローカル上のnm-test-repository
ディレクトリ内に、Terraformで使用するコードを保管しています。
こちらをリモートリポジトリであるGitHubにプッシュすることが今回のゴールとなります。
※事前にGitHub上にnm-test
というリモートリポジトリを用意しておきます
下記の手順でnm-test-repository
にGit環境を用意していきます。
$ git init Reinitialized existing Git repository in /home/nm-user/work/nm-test-repository/.git/ $ git add . $ git commit -m "first commit" [main (root-commit) 7c53323] first commit 6 files changed, 219 insertions(+) create mode 100644 .terraform.lock.hcl create mode 100755 .terraform/providers/registry.terraform.io/hashicorp/aws/4.60.0/linux_amd64/terraform-provider-aws_v4.60.0_x5 create mode 100644 .terraform/terraform.tfstate create mode 100644 provider.tf create mode 100644 variable.tf create mode 100644 vpc.tf $ git remote add origin https://github.com/nm-test/nm-test-repository.git
GitHubへのプッシュに失敗
Gitの準備が整ったのでgit push origin main
でリモートリポジトリにプッシュしたところ、下記のようなエラーが出ました。
GitHubはファイル当たりのサイズは100MBまでのため、今回プッシュを試みた.terraform
ディレクトリ配下のファイルサイズが大きすぎたことが原因です。
$ git push origin main Username for 'https://github.com/nm-test/nm-test-repository.git': nm-test-token Password for 'https://nm-test-token@github.com/nm-test/nm-test-repository.git': Enumerating objects: 15, done. Counting objects: 100% (15/15), done. Compressing objects: 100% (10/10), done. Writing objects: 100% (15/15), 73.90 MiB | 3.47 MiB/s, done. Total 15 (delta 0), reused 0 (delta 0), pack-reused 0 remote: error: Trace: 253872f852edcd4d924a1b52a952a63621ba1421762d0670eb954dbe81f1ddfa remote: error: See http://git.io/iEPt8g for more information. remote: error: File .terraform/providers/registry.terraform.io/hashicorp/aws/4.60.0/linux_amd64/terraform-provider-aws_v4.60.0_x5 is 331.69 MB; this exceeds GitHub's file size limit of 100.00 MB remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com. To https://github.com/nm-test/nm-test-repository.git ! [remote rejected] main -> main (pre-receive hook declined) error: failed to push some refs to 'https://github.com/nm-test/nm-test-repository.git'
.terraform
ディレクトリ配下をGitの管理外とするため、.gitignore
を設定します。
.gitignore
とはGitで使われる特殊なファイル名で、このファイルに書かれたファイルやディレクトリはGitのトラッキングの対象外になります。
nm-test-repository
ディレクトリ配下に下記の内容で.gitignore
ファイルを作成しました。
# Local .terraform directories **/.terraform/*
.gitignore
ファイルを保存し、改めてプッシュの準備をしていきます。
$ git add . $ git commit -m ".gitignore追加"
再度GitHubにプッシュしましたが、やはりファイルサイズの制限に引っ掛かりプッシュすることができませんでした。
.gitignore
ファイルを用意して.terraform
ディレクトリをGitの管理対象外として設定したのになぜでしょうか。
$ git push origin main Enumerating objects: 18, done. Counting objects: 100% (18/18), done. Compressing objects: 100% (12/12), done. Writing objects: 100% (18/18), 73.90 MiB | 3.45 MiB/s, done. Total 18 (delta 1), reused 0 (delta 0), pack-reused 0 remote: Resolving deltas: 100% (1/1), done. remote: error: Trace: a17c36s6262ds02s30s046f5c99sa7d7694d68s4s1026fbeab1cs7f213essd99 remote: error: See http://git.io/iEPt8g for more information. remote: error: File .terraform/providers/registry.terraform.io/hashicorp/aws/4.60.0/linux_amd64/terraform-provider-aws_v4.60.0_x5 is 331.69 MB; this exceeds GitHub's file size limit of 100.00 MB remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com. To https://github.com/nm-test/nm-test-repository.git ! [remote rejected] main -> main (pre-receive hook declined) error: failed to push some refs to 'https://github.com/nm-test/nm-test-repository.git'
原因と対処方法
結論から言うと最初のコミット後に.gitignoreを追加した場合、対象外としたいディレクトリ(.terraform
)がGitの履歴に残ってしまっているためにGitの管理対象から除外されないことが原因でした。
そのため最初のコミット後に.gitignoreを追加する場合は、Gitの履歴を削除した上で改めてプッシュする必要があります。
下記のコマンドを叩き、Gitの履歴から対象外としたいディレクトリ(.terraform
)を削除します。
$ git filter-branch -f --index-filter 'git rm --cached -r --ignore-unmatch .terraform/'
サイズ制限に引っ掛かることなく無事にプッシュできました。
$ git push origin main Enumerating objects: 13, done. Counting objects: 100% (13/13), done. Compressing objects: 100% (12/12), done. Writing objects: 100% (13/13), 2.69 KiB | 393.00 KiB/s, done. Total 13 (delta 3), reused 0 (delta 0), pack-reused 0 remote: Resolving deltas: 100% (3/3), done. To https://github.com/nm-test/nm-test-repository.git * [new branch] main -> main
さいごに
今回はGitHubを使用する上で、.gitignoreの注意点と対処方法ついてご紹介しました。もちろん最初のコミットの前から.gitignoreファイルを用意しておけばよいのですが、うっかり用意せずにコミットしてしまった場合は上記の手順で対処いただければと思います。 この記事がどなたかのお役に立てば幸いです。
参考記事
100MBを超えるファイルを間違えてコミットしてgit pushできない、、
ネクストモードについて
ネクストモード株式会社は東日本電信電話株式会社とクラスメソッド株式会社で設立したクラウドカンパニーです。 「クラウドであたらしい働き方を」というメッセージを掲げ、さまざまなクラウド技術や製品を組み合わせて企業の働き方の当たり前を変えていくことを目指しています。 クラウドやSaaSのご利用に関してお困りごとがあれば、ネクストモードまでぜひお問い合わせください。